package cn.orangeframe.neon.domain.model;

import cn.orangeframe.neon.domain.entity.Auditable;
import cn.orangeframe.neon.domain.entity.WorkflowTask;
import cn.orangeframe.neon.domain.enums.TaskStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Map;
import java.util.concurrent.CountDownLatch;

/**
 * 该类用于描述一个任务的基本信息。
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class TaskModel extends Auditable {

    /**
     * 任务ID
     */
    private String taskId;
    /**
     * 任务参考名称
     */
    private String taskReferenceName;
    /**
     * 任务定义名称
     */
    private String taskDefName;
    /**
     * 任务类型
     */
    private String taskType;
    /**
     * 工作流实例ID
     */
    private String workflowInstanceId;
    /**
     * 计划时间
     */
    private long scheduledTime;
    /**
     * 开始时间
     */
    private long startTime;
    /**
     * 结束时间
     */
    private long endTime;
    /**
     * 工作流任务
     */
    private WorkflowTask workflowTask;
    /**
     * 是否已执行
     */
    private boolean executed;
    /**
     * 任务状态
     */
    private TaskStatus status;
    /**
     * 输入参数
     */
    private Map<String, Object> inputData;
    /**
     * 输出参数
     */
    private Map<String, Object> outputData;
    /**
     * 重试次数
     */
    private int retryCount = 0;
    /**
     * 重试任务ID
     */
    private String retriedTaskId;
    /**
     * 迭代次数
     */
    private int iteration = 0;
    /**
     * 异步任务latch
     */
    private CountDownLatch latch;
    /**
     * 任务未完成原因
     */
    private String reasonForInCompletion;

    public void addOutput(String key, Object value) {
        this.outputData.put(key, value);
    }

    public boolean isLoopOverTask() {
        return iteration > 0;
    }
}

